package com.dashu.authority.util;

public class Competence {

	// 最大权限值
	public static Long MAX_AUTHORITY = 8589934590L;

	/**
	 * 根据权限点得到权限的总和
	 * 
	 * @param i
	 * @return
	 */
	public Long getProduct(Integer[] i) {
		Long x = 0L;
		if (i == null || i.length == 0) {
			return x;
		}
		for (long j : i) {
			x = x + (long) Math.pow(2, j);
		}
		return x;
	}

	/**
	 * 添加一个权限点
	 * 
	 * @param i
	 * @return
	 */
	public Long addProduct(Long i, Integer y) {
		return (i) | ((long) Math.pow(2, y));
	}

	/**
	 * 移除一个权限点
	 * 
	 * @param i
	 * @return
	 */
	public Long rmProduct(Long i, Integer y) {
		return (i) & ~((long) Math.pow(2, y));
	}

	/**
	 * 合并两个权限值
	 * 
	 * @param i
	 * @return
	 */
	public Long ergerProduct(Long i, Long y) {
		return i | y;
	}

	/**
	 * 检查权限点是否在权限值中
	 * 
	 * @param i
	 * @return
	 */
	public boolean checkProduct(Long i, Integer y) {
		Long x = (long) Math.pow(2, y);
		return x == (i & x);
	}

	public static void main(String[] args) {
		Integer[] ii = new Integer[] { 1,3,5,6,7 };
		// Long[] iii = new Long[]{1L,2L,4L,5L};
		Competence c = new Competence();
		
		 Long comp = c.getProduct(ii);//计算出权限值
		 comp = c.addProduct(comp, 3);
		 
		 System.out.println(comp);
		// Long comp1 = getProduct(iii);//计算出权限值
		// comp = ergerProduct(comp, comp1);//合并两个权限值 重复的权限合并也可以
		// comp=addProduct(comp, 7);//添加一个额外的权限点
		// comp=addProduct(comp, 7);//添加一个额外的权限点多次添加也没关系
		// comp = rmProduct(comp, 5);//移除一个权限值
		// comp = rmProduct(comp, 5);//移除一个权限值 多次移除也没关系
		// System.out.println(checkProduct(comp, 1L));//检查权限
		// System.out.println(checkProduct(comp, 2L));
		// System.out.println(checkProduct(comp, 3L));
		// System.out.println(checkProduct(comp, 4L));
		// System.out.println(checkProduct(comp, 5L));
		// System.out.println(checkProduct(comp, 7L));
		// System.out.println(checkProduct(comp, 8L));
		// System.out.println(checkProduct(comp, 9L));

	}

}
